package Veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import Veterinaria.excepcion.*;
import Veterinaria.modelo.Doctor;
import Veterinaria.modelo.Paciente;
import Veterinaria.modelo.Persona;
import Veterinaria.negocio.GestionPersona;
import Veterinaria.util.ConexionBD;

public class PacienteDAO extends BaseDAO {

	// Busca Paciente por Nombre
	public Collection<Paciente> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		String query = "select a.idpaciente, a.iddueno, a.nombre, a.raza, a.genero, a.tiposangre, a.tamano, a.actividad, a.peso, a.esteril, a.fecnac, a.notas, a.imagen from paciente as a where a.estado = '1' and  a.nombre like ?";
		Collection<Paciente> lista = new ArrayList<Paciente>();
		GestionPersona persona = new GestionPersona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Paciente vo = new Paciente();
				vo.setCodigo_paciente(rs.getString("a.idpaciente"));
				vo.setoDueno(persona.obtenerDueno(rs.getString("a.iddueno")));
				vo.setNombre_paciente(rs.getString("a.nombre"));
				vo.setRaza(rs.getString("a.raza"));
				vo.setGenero(rs.getString("a.genero"));
				vo.setTipo_sangre(rs.getString("a.tiposangre"));
				vo.setTamano(rs.getString("a.tamano"));
				vo.setActividad(rs.getString("a.actividad"));
				vo.setEsteril(rs.getString("a.esteril"));
				vo.setPeso(rs.getString("a.peso"));
				vo.setFec_nacimiento(rs.getString("a.fecnac"));
				vo.setNotas(rs.getString("a.notas"));
				vo.setImagen_paciente(rs.getString("a.imagen"));

				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Paciente insertar(Paciente vo) throws DAOExcepcion,
			CodigoDuplicadoExcepcion, ValidaNombreExcepcion {
		String query = "insert into paciente(idpaciente, iddueno, nombre,raza, genero, tiposangre, "
				+ "tamano, actividad, peso, esteril, fecnac, notas, imagen, "
				+ "estado) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		if (NoExistePaciente(vo.getCodigo_paciente())) {
			if (vo.getNombre_paciente().isEmpty()) {
				throw new ValidaNombreExcepcion();
			} else {
				try {
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(query);
					stmt.setString(1, vo.getCodigo_paciente());
					stmt.setString(2, vo.getoDueno().getCodigo_persona());
					stmt.setString(3, vo.getNombre_paciente());
					stmt.setString(4, vo.getRaza());
					stmt.setString(5, vo.getGenero());
					stmt.setString(6, vo.getTipo_sangre());
					stmt.setString(7, vo.getTamano());
					stmt.setString(8, vo.getActividad());
					stmt.setString(9, vo.getPeso());
					stmt.setString(10, vo.getEsteril());
					stmt.setString(11, vo.getFec_nacimiento());
					stmt.setString(12, vo.getNotas());
					stmt.setString(13, vo.getImagen_paciente());
					stmt.setString(14, vo.getEstado());
					int i = stmt.executeUpdate();
					if (i != 1) {
						throw new SQLException("No se pudo insertar");
					}
					// Obtener el ultimo id
					int id = 0;
					String idPaciente;
					query = "select last_insert_id()";
					stmt = con.prepareStatement(query);
					rs = stmt.executeQuery();
					if (rs.next()) {
						id = rs.getInt(1);

					}
					idPaciente = id + "";
					vo.setCodigo_paciente(idPaciente);

				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				} finally {
					this.cerrarResultSet(rs);
					this.cerrarStatement(stmt);
					this.cerrarConexion(con);
				}
			}
		} else
			throw new CodigoDuplicadoExcepcion(vo.getCodigo_paciente());

		return vo;
	}

	public Paciente obtener(String idPaciente) throws DAOExcepcion {
		Paciente vo = new Paciente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idpaciente, iddueno, nombre, raza, genero, tiposangre, "
					+ "tamano, actividad, peso, esteril, fecnac, notas, "
					+ "imagen, estado from paciente where idpaciente=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idPaciente);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigo_paciente(rs.getString(1));
				vo.setNombre_paciente(rs.getString(3));
				vo.setRaza(rs.getString(4));
				vo.setGenero(rs.getString(5));
				vo.setTipo_sangre(rs.getString(6));
				vo.setTamano(rs.getString(7));
				vo.setActividad(rs.getString(8));
				vo.setPeso(rs.getString(9));
				vo.setEsteril(rs.getString(10));
				vo.setFec_nacimiento(rs.getString(11));
				vo.setNotas(rs.getString(12));
				vo.setImagen_paciente(rs.getString(13));
				vo.setEstado(rs.getString(14));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(String idpaciente) throws DAOExcepcion {
		String query = "update paciente set estado='0' where idpaciente=?";

		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idpaciente);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Paciente actualizar(Paciente vo) throws DAOExcepcion {
		String query = "update paciente set nombre=?, raza=?, genero=?, "
				+ "tiposangre=?, tamano=?, actividad=?, peso=?, "
				+ "esteril=?, fecnac=?, notas=?, imagen=?, estado=? where idpaciente=?";

		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre_paciente());
			stmt.setString(2, vo.getRaza());
			stmt.setString(3, vo.getGenero());
			stmt.setString(4, vo.getTipo_sangre());
			stmt.setString(5, vo.getTamano());
			stmt.setString(6, vo.getActividad());
			stmt.setString(7, vo.getPeso());
			stmt.setString(8, vo.getEsteril());
			stmt.setString(9, vo.getFec_nacimiento());
			stmt.setString(10, vo.getNotas());
			stmt.setString(11, vo.getImagen_paciente());
			stmt.setString(12, vo.getEstado());
			stmt.setString(13, vo.getCodigo_paciente());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Paciente> listar() throws DAOExcepcion {
		Collection<Paciente> p = new ArrayList<Paciente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select * from paciente order by nombre";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Paciente vo = new Paciente();
				vo.setCodigo_paciente(rs.getString("idpaciente"));
				vo.setNombre_paciente(rs.getString("nombre"));
				vo.setRaza(rs.getString("raza"));
				p.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return p;
	}

	private boolean NoExistePaciente(String codigo) throws DAOExcepcion {
		return obtenerPaciente(codigo) == null;
	}

	public Paciente obtenerPaciente(String idPaciente) throws DAOExcepcion {
		Paciente vo = new Paciente();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idpaciente, iddueno, nombre, raza, genero, tiposangre, "
					+ "tamano, actividad, peso, esteril, fecnac, notas, "
					+ "imagen, estado from paciente where idpaciente=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idPaciente);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigo_paciente(rs.getString(1));
				vo.setNombre_paciente(rs.getString(3));
				vo.setRaza(rs.getString(4));
				vo.setGenero(rs.getString(5));
				vo.setTipo_sangre(rs.getString(6));
				vo.setTamano(rs.getString(7));
				vo.setActividad(rs.getString(8));
				vo.setPeso(rs.getString(9));
				vo.setEsteril(rs.getString(10));
				vo.setFec_nacimiento(rs.getString(11));
				vo.setNotas(rs.getString(12));
				vo.setImagen_paciente(rs.getString(13));
				vo.setEstado(rs.getString(14));
				return vo;
			} else
				return null;

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());

		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

	public Paciente GenerarCodigo() throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String Cad = "0";
		Integer Num = 0;
		try {
			String query = "Select max(idpaciente) as codigo from paciente";
			Paciente paciente = new Paciente();
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				Cad = rs.getString(1);
				if (Cad == null) {
					Cad = "0000";
				}
			}
			Num = Integer.parseInt(Cad.substring(1, Cad.length()));
			Num = Num + 1;
			String convierte = String.valueOf(Num);
			String codigo = "000" + convierte;

			if (4 <= codigo.length()) {
				int Inicio = (codigo.length() - 4);
				codigo = codigo.substring(Inicio, codigo.length());
			} else {
				codigo = Cad;
			}
			codigo = "P" + codigo;
			paciente.setCodigo_paciente(codigo);

			return paciente;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}
	
	
	public Collection<Paciente> obtenerPorNombreRaza(String nombre, String raza, String estado) throws DAOExcepcion {
		Collection<Paciente> l = new ArrayList<Paciente>();
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String query;
		try {
			 
				// System.out.println("En las otras " + tipo);
				query = "SELECT distinct p.idpaciente, p.iddueno, p.nombre, p.raza, p.genero," +
						"p.tiposangre, p.tamano, p.actividad, p.peso, p.esteril, p.fecnac," +
						"p.notas, p.imagen, p.estado, d.nombre, d.apellido from paciente p" +
						" INNER JOIN persona d where d.idpersona=p.iddueno and p.nombre like '%" + nombre + "%' and " +
						" p.raza like '%" + raza + "%' and " +
						" p.estado like '%" + estado + "%' group by p.idpaciente order by p.idpaciente asc ";
								
			 con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			// stmt.setString(1, codigo_persona);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Paciente vo = new Paciente();
				
				vo.setCodigo_paciente(rs.getString("p.idpaciente"));
				//vo.setoDueno(rs.getString("p.iddueno"));
				vo.setNombre_paciente(rs.getString("p.nombre"));
				vo.setRaza(rs.getString("p.raza"));
				vo.setGenero(rs.getString("p.genero"));
				vo.setTipo_sangre(rs.getString("p.tiposangre"));
				vo.setTamano(rs.getString("p.tamano")); 
				vo.setActividad(rs.getString("p.actividad"));
				vo.setPeso(rs.getString("p.peso"));
				vo.setEsteril(rs.getString("p.esteril"));
				vo.setFec_nacimiento(rs.getString("p.fecnac"));
				vo.setNotas(rs.getString("p.notas"));
				vo.setImagen_paciente(rs.getString("p.imagen"));
				vo.setEstado(rs.getString("p.estado"));
				
				Persona pe = new Persona();
				
				pe.setCodigo_persona(rs.getString("p.iddueno"));
				pe.setNombre_persona(rs.getString("d.nombre"));
				pe.setApellido_persona(rs.getString("d.apellido"));
				vo.setoPersona(pe);
				l.add(vo);
			} 
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return l;
	}
	
	public Collection<Paciente> PacientesxDueno(String codigo) throws DAOExcepcion {
		Collection<Paciente> l = new ArrayList<Paciente>();
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String query;
		try {
			 query = "SELECT distinct p.idpaciente, p.nombre, p.raza, p.genero FROM paciente p INNER JOIN dueno d " +
					 " where p.iddueno='" + codigo + "'" +
					" order by p.idpaciente asc";
				
				//				
			 con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			// stmt.setString(1, codigo_persona);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Paciente vo = new Paciente();
				
				vo.setCodigo_paciente(rs.getString("p.idpaciente"));
				vo.setNombre_paciente(rs.getString("p.nombre"));
				vo.setRaza(rs.getString("p.raza"));
				vo.setGenero(rs.getString("p.genero"));
				
				l.add(vo);
			} 
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return l;
	}

}
